<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // // 1.1
        // // let a = 1;
        // var a = 1;
        // function foo() {
        //     console.log(this.a)
        // }
        // foo();

        // // 1.2
        // "use strict";
        // var a = 10;
        // function foo() {
        //     console.log('this1', this)
        //     console.log(window.a)
        //     console.log(this.a)
        // }
        // console.log(window.foo)
        // console.log('this2', this)
        // foo();
        // 1.3
        // let a = 10
        // const b = 20
        // function foo() {
        //     console.log(this.a)
        //     console.log(this.b)
        // }
        // foo();
        // console.log(window.a)
        // 1.4
        // var a = 1
        // function foo() {
        //     var a = 2
        //     console.log(this)
        //     console.log(this.a)
        // }
        // foo();
        // 1.5
        // var a = 1
        // function foo() {
        //     var a = 2
        //     function inner() {
        //         console.log(this.a)
        //     }
        //     inner()
        // }
        // foo();
        // 2.1
        // function foo() {
        //     console.log(this.a)
        // }
        // var obj = { a: 1, foo }
        // var a = 2
        // obj.foo();
        // 2.2
        // var obj = {
        //     a: 1,
        //     foo: function () {
        //         console.log(this.a)
        //     }
        // }
        // obj.foo();
        // 3.1
        // function foo() {
        //     console.log(this.a)
        // };
        // var obj = { a: 1, foo };
        // var a = 2;
        // var foo2 = obj.foo;
        // obj.foo();
        // foo2();
        // // 3.2
        // function foo() {
        //     console.log(this.a)
        // };
        // var obj = { a: 1, foo };
        // var a = 2;
        // var foo2 = obj.foo;
        // var obj2 = { a: 3, foo2: obj.foo }

        // obj.foo();
        // foo2();
        // obj2.foo2();
        // // 3.3
        // function foo() {
        //     console.log(this.a)
        // }
        // function doFoo(fn) {
        //     console.log(this)
        //     fn()
        // }
        // var obj = { a: 1, foo }
        // var a = 2
        // doFoo(obj.foo)
        // // 3.4
        // function foo() {
        //     console.log(this.a)
        // }
        // function doFoo(fn) {
        //     console.log(this)
        //     fn()
        // }
        // var obj = { a: 1, foo }
        // var a = 2
        // var obj2 = { a: 3, doFoo }
        // obj2.doFoo(obj.foo)
        // // 4.1
        // function foo() {
        //     console.log(this.a)
        // }
        // var obj = { a: 1 }
        // var a = 2

        // foo()
        // foo.call(obj)
        // foo.apply(obj)
        // foo.bind(obj) //没有执行
        // foo.bind(obj)()
        // // 4.3
        // var obj1 = {
        //     a: 1
        // }
        // var obj2 = {
        //     a: 2,
        //     foo1: function () {
        //         console.log(this.a)
        //     },
        //     foo2: function () {
        //         setTimeout(function () {
        //             console.log(this)
        //             console.log(this.a)
        //         }.call(obj1), 0)
        //     }
        // }
        // var a = 3
        // obj2.foo1()
        // obj2.foo2()
        // // 4.4
        // var obj1 = {
        //     a: 1
        // }
        // var obj2 = {
        //     a: 2,
        //     foo1: function () {
        //         console.log(this.a)
        //     },
        //     foo2: function () {
        //         function inner() {
        //             console.log(this)
        //             console.log(this.a)
        //         }
        //         inner.call(obj1)
        //     }
        // }
        // var a = 3
        // obj2.foo1()
        // obj2.foo2()
        // // 4.5
        // function foo() {
        //     console.log(this.a)
        // }
        // var obj = { a: 1 }
        // var a = 2

        // foo()
        // foo.call(obj)
        // foo().call(obj)
        // // 4.6
        // function foo() {
        //     console.log(this.a)
        //     return function () {
        //         console.log(this.a)
        //     }
        // }
        // var obj = { a: 1 }
        // var a = 2

        // foo()
        // foo.call(obj)
        // foo().call(obj)
        // // 4.7
        // function foo() {
        //     console.log(this.a)
        //     return function () {
        //         console.log(this.a)
        //     }
        // }
        // var obj = { a: 1 }
        // var a = 2

        // foo()
        // foo.bind(obj)
        // foo().bind(obj)
        // // 4.8
        // function foo() {
        //     console.log(this.a)
        //     return function () {
        //         console.log(this.a)
        //     }
        // }
        // var obj = { a: 1 }
        // var a = 2

        // foo.call(obj)()
        // // 4.9
        // var obj = {
        //     a: 'obj',
        //     foo: function () {
        //         console.log('foo:', this.a)
        //         return function () {
        //             console.log('inner:', this.a)
        //         }
        //     }
        // }
        // var a = 'window'
        // var obj2 = { a: 'obj2' }

        // obj.foo()()
        // obj.foo.call(obj2)()
        // obj.foo().call(obj2)
        // // 4.10
        // var obj = {
        //     a: 1,
        //     foo: function (b) {
        //         b = b || this.a
        //         return function (c) {
        //             console.log(this.a + b + c)
        //         }
        //     }
        // }
        // var a = 2
        // var obj2 = { a: 3 }

        // obj.foo(a).call(obj2, 1)
        // obj.foo.call(obj2)(1)
        // // 5.1
        // function foo1() {
        //     console.log(this.a)
        // }
        // var a = 1
        // var obj = {
        //     a: 2
        // }

        // var foo2 = function () {
        //     foo1.call(obj)
        // }

        // foo2()
        // foo2.call(window)
        // // 5.2
        // function foo1(b) {
        //     console.log(`${this.a} + ${b}`)
        //     return this.a + b
        // }
        // var a = 1
        // var obj = {
        //     a: 2
        // }

        // var foo2 = function () {
        //     return foo1.call(obj, ...arguments)
        // }

        // var num = foo2(3)
        // console.log(num)
        // // 5.3
        // function foo(item) {
        //     console.log(item, this.a)
        // }
        // var obj = {
        //     a: 'obj'
        // }
        // var a = 'window'
        // var arr = [1, 2, 3]

        // // arr.forEach(foo, obj)
        // // arr.map(foo, obj)
        // arr.filter(function (i) {
        //     console.log(i, this.a)
        //     return i > 2
        // }, obj)
        // // 6.1
        // function Person(name) {
        //     this.name = name
        // }
        // var name = 'window'
        // var person1 = new Person('LinDaiDai')
        // console.log(person1.name)
        // // 6.2
        // function Person(name) {
        //     this.name = name
        //     this.foo1 = function () {
        //         console.log(this.name)
        //     }
        //     this.foo2 = function () {
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var person1 = new Person('person1')
        // person1.foo1()
        // person1.foo2()()
        // // 6.3
        // var name = 'window'
        // function Person(name) {
        //     this.name = name
        //     this.foo = function () {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var person2 = {
        //     name: 'person2',
        //     foo: function () {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        // }

        // var person1 = new Person('person1')
        // person1.foo()()
        // person2.foo()()
        // // 6.4
        // var name = 'window'
        // function Person(name) {
        //     this.name = name
        //     this.foo = function () {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var person1 = new Person('person1')
        // var person2 = new Person('person2')

        // person1.foo.call(person2)()
        // person1.foo().call(person2)
        // // 7.1
        // var obj = {
        //     name: 'obj',
        //     foo1: () => {
        //         console.log(this.name)
        //     },
        //     foo2: function () {
        //         console.log(this.name)
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var name = 'window'
        // obj.foo1()
        // obj.foo2()()
        // // 7.2
        // var name = 'window'
        // var obj1 = {
        //     name: 'obj1',
        //     foo: function () {
        //         console.log(this.name)
        //     }
        // }

        // var obj2 = {
        //     name: 'obj2',
        //     foo: () => {
        //         console.log(this.name)
        //     }
        // }

        // obj1.foo()
        // obj2.foo()
        // // 7.3
        // var name = 'window'
        // var obj1 = {
        //     name: 'obj1',
        //     foo: function () {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var obj2 = {
        //     name: ' ',
        //     foo: function () {
        //         console.log(this.name)
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var obj3 = {
        //     name: 'obj3',
        //     foo: () => {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var obj4 = {
        //     name: 'obj4',
        //     foo: () => {
        //         console.log(this.name)
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        // }

        // obj1.foo()()
        // obj2.foo()()
        // obj3.foo()()
        // obj4.foo()()
        // // 7.4
        // var name = 'window'
        // function Person(name) {
        //     this.name = name
        //     this.foo1 = function () {
        //         console.log(this.name)
        //     }
        //     this.foo2 = () => {
        //         console.log(this.name)
        //     }
        // }
        // var person2 = {
        //     name: 'person2',
        //     foo2: () => {
        //         console.log(this.name)
        //     }
        // }
        // var person1 = new Person('person1')
        // person1.foo1()
        // person1.foo2()
        // person2.foo2()
        // // 7.5
        // var name = 'window'
        // function Person(name) {
        //     this.name = name
        //     this.foo1 = function () {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        //     this.foo2 = function () {
        //         console.log(this.name)
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        //     this.foo3 = () => {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        //     this.foo4 = () => {
        //         console.log(this.name)
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var person1 = new Person('person1')
        // person1.foo1()()
        // person1.foo2()()
        // person1.foo3()()
        // person1.foo4()()
        // // 7.6
        // var name = 'window'
        // var obj1 = {
        //     name: 'obj1',
        //     foo1: function () {
        //         console.log(this.name)
        //         return () => {
        //             console.log(this.name)
        //         }
        //     },
        //     foo2: () => {
        //         console.log(this.name)
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var obj2 = {
        //     name: 'obj2'
        // }
        // obj1.foo1.call(obj2)()
        // obj1.foo1().call(obj2)
        // obj1.foo2.call(obj2)()
        // obj1.foo2().call(obj2)
        // // 8.1
        // var name = 'window'
        // var person1 = {
        //     name: 'person1',
        //     foo1: function () {
        //         console.log(this.name)
        //     },
        //     foo2: () => console.log(this.name),
        //     foo3: function () {
        //         return function () {
        //             console.log(this.name)
        //         }
        //     },
        //     foo4: function () {
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var person2 = { name: 'person2' }
        // person1.foo1() 
        // person1.foo1.call(person2) 
        // person1.foo2() 
        // person1.foo2.call(person2) 
        // person1.foo3()() 
        // person1.foo3.call(person2)()  
        // person1.foo3().call(person2) 
        // person1.foo4()() 
        // person1.foo4.call(person2)() 
        // person1.foo4().call(person2) 
        // // 8.2
        // var name = 'window'
        // function Person(name) {
        //     this.name = name
        //     this.foo1 = function () {
        //         console.log(this.name)
        //     }
        //     this.foo2 = () => console.log(this.name)
        //     this.foo3 = function () {
        //         return function () {
        //             console.log(this.name)
        //         }
        //     }
        //     this.foo4 = function () {
        //         return () => {
        //             console.log(this.name)
        //         }
        //     }
        // }
        // var person1 = new Person('person1')
        // var person2 = new Person('person2')

        // person1.foo1() 
        // person1.foo1.call(person2) 
        // person1.foo2()
        // person1.foo2.call(person2)
        // person1.foo3()()
        // person1.foo3.call(person2)()
        // person1.foo3().call(person2)
        // person1.foo4()()
        // person1.foo4.call(person2)()
        // person1.foo4().call(person2)
        // // 8.3
        // var name = 'window'
        // function Person(name) {
        //     this.name = name
        //     this.obj = {
        //         name: 'obj',
        //         foo1: function () {
        //             return function () {
        //                 console.log(this.name)
        //             }
        //         },
        //         foo2: function () {
        //             return () => {
        //                 console.log(this.name)
        //             }
        //         }
        //     }
        // }
        // var person1 = new Person('person1')
        // var person2 = new Person('person2')

        // person1.obj.foo1()() 
        // person1.obj.foo1.call(person2)() 
        // person1.obj.foo1().call(person2)

        // person1.obj.foo2()()
        // person1.obj.foo2.call(person2)()
        // person1.obj.foo2().call(person2) 
        // 8.4
        function foo() {
            console.log(this.a);
        }
        var a = 2;
        (function () {
            "use strict";
            foo();
        })();



















    </script>

</body>

</html>